`timescale 1ns / 1ps
`define DEBUG 
module tb ;
reg clk,rst_n;

//生成始时钟
parameter NCLK = 4;
initial begin
	clk=0;
	forever clk=#(NCLK/2) ~clk; 
end 

/****************** BEGIN ADD module inst ******************/

reg [31:0] arr , ccr ;
reg start = 0 ;
reg zero = 0  ; 
reg signed [31:0] step ;
task Walk(input signed [31:0] s ) ;
begin 
    wait(u_cbb_StepMotor.o_busy==1'b0) ;
    @(posedge clk) ;
    @(posedge clk) begin
        start <= 1'b0 ;
        step <= s ;
    end
    @(posedge clk) begin
        start <= 1'b1 ;
    end
    repeat(100) @(posedge clk) ;
end
endtask 

cbb_StepMotor #(
    .FCLK(1000_000),    // 系统时钟
    .W(32) ,            // 步进电机位宽
    .SW (32),           // 位移记录的位宽
    .EN_ACC(1'b1),      // 使能加减速
    .MIN_FS( 10_000 ),  // 最小速度
    .MAX_FS (20_000),   // 最大速度
    .INIT_FS ( 10_000 ),// 启动速度
    .ACCEL (8 ),        // 加速度，每次加速减小的分频系数
    .DECEL (2 ),        // 减速度，每次减速增加的分频系数
    .EXT_STEPS( 10) ,   //  减速到最小速度后，按最小速度走的步数,避免速度刚下来有过冲失步
    .ADJUST_STEPS (1)  // 多少个脉冲调节一次速度
) u_cbb_StepMotor (
    .clk( clk ),
    .rst_n( rst_n) ,
    .i_divider(25) ,            // 时钟分频值，脉冲频率 为fclk/2/i_divider，只在 EN_ACC=1 时生效
    .i_step(step) ,             // 要走的位移，正负表示方向 
    .i_start(start) ,           // 上升沿触发一次运动
    .i_zero(zero) ,             // 外部光电开关或其他器件表示的步进电机0位置
    .i_autoStopAtZero(1'b1) ,   // 是否需要自动停止，当找到零点时 ,1:自动停止
    .o_busy() ,                 // 是否忙
    .o_x() ,                    // 当前位移 
    .o_pulse(),      // 步进电机脉冲输出
    .o_dir(),        // 步进电机方向
    .o_en()          // 步进电机使能
);
/****************** BEGIN END module inst ******************/

initial begin
    $dumpfile("wave.lxt2");
    $dumpvars(0, tb);   //dumpvars(深度, 实例化模块1，实例化模块2，.....)
end

initial begin
    zero = 1'b0 ;
    // #(1000) zero = 1; 
    #(10) zero = 0; 
end 

initial begin
   	rst_n = 1;
    #(NCLK) rst_n=0;
    #(NCLK) rst_n=1; //复位信号

    // Walk(-12) ; wait(u_cbb_StepMotor.o_busy==1'b0) ; repeat(100) @(posedge clk) ;
    Walk(1000) ; wait(u_cbb_StepMotor.o_busy==1'b0) ; repeat(100) @(posedge clk) ;
    
	repeat(1000) @(posedge clk)begin

	end
	$display("sim done!");
	$dumpflush;
	$finish;
	$stop;	
end 
endmodule
